import request from '@/utils/request'

// ---- 类型定义 ----
// 查询参数：保持与后端约定 (基于 RuoYi 常规分页、筛选字段)。
export interface ProjectQuery {
  name?: string;       // 项目名称模糊匹配
  code?: string;       // 项目编码
  status?: string | number; // 状态筛选
  beginTime?: string;  // 创建时间范围开始 (yyyy-MM-dd HH:mm:ss)
  endTime?: string;    // 创建时间范围结束
  pageNum?: number;    // 页码
  pageSize?: number;   // 每页大小
  [key: string]: any;  // 允许传入其他扩展查询参数
}

export interface Project {
  id: number | string;
  name?: string;
  code?: string;
  status?: string | number;
  remark?: string;
  createTime?: string;
  updateTime?: string;
  [key: string]: any;
}

// 后端统一响应基础结构
export interface BaseResponse {
  code: number;
  msg?: string;
}
// 单体数据响应 (data 存放具体对象)
export interface DataResponse<T = any> extends BaseResponse {
  data?: T; // 某些接口可能不返回 data，故设为可选
}
// 列表分页响应 (rows + total)
export interface ListResponse<T = any> extends BaseResponse {
  rows?: T[]; // 某些异常情况下可能为 undefined
  total?: number;
}

// ---- 接口函数 ----
/** 查询项目列表 */
export function listProject(query?: ProjectQuery): Promise<ListResponse<Project>> {
  return request({
    url: '/system/project/list',
    method: 'get',
    params: query
  }) as Promise<ListResponse<Project>>;
}

/** 查询项目详细 */
export function getProject(id: number | string): Promise<DataResponse<Project>> {
  return request({
    url: '/system/project/' + id,
    method: 'get'
  }) as Promise<DataResponse<Project>>;
}

/** 新增项目 */
export function addProject(data: Partial<Project>): Promise<BaseResponse & { data?: any }> {
  return request({
    url: '/system/project',
    method: 'post',
    data
  }) as Promise<BaseResponse & { data?: any }>;
}

/** 修改项目 */
export function updateProject(data: Partial<Project>): Promise<BaseResponse & { data?: any }> {
  return request({
    url: '/system/project',
    method: 'put',
    data
  }) as Promise<BaseResponse & { data?: any }>;
}

/** 删除项目 */
export function delProject(id: number | string): Promise<BaseResponse & { data?: any }> {
  return request({
    url: '/system/project/' + id,
    method: 'delete'
  }) as Promise<BaseResponse & { data?: any }>;
}

// ---- 小工具 ----
/**
 * 提取单体 data (若 code === 200)，否则抛错
 */
export async function unwrapData<T>(p: Promise<DataResponse<T>>): Promise<T> {
  const res = await p;
  if (res.code !== 200) throw new Error(res.msg || '接口错误:' + res.code);
  return res.data as T;
}

/**
 * 提取列表响应 (若 code === 200)，保证 rows/total 有默认值
 */
export async function unwrapList<T>(p: Promise<ListResponse<T>>): Promise<{ rows: T[]; total: number; raw: ListResponse<T> }> {
  const res = await p;
  if (res.code !== 200) throw new Error(res.msg || '接口错误:' + res.code);
  return { rows: res.rows || [], total: res.total || 0, raw: res };
}

/**
 * 通用 unwrap：自动识别 data / rows 结构，返回最可能的值。
 * - 若存在 data -> 返回 data
 * - 否则返回 { rows, total }
 */
export async function unwrap<T>(p: Promise<DataResponse<T> | ListResponse<T>>): Promise<any> {
  const res: any = await p;
  if (res.code !== 200) throw new Error(res.msg || '接口错误:' + res.code);
  if (Object.prototype.hasOwnProperty.call(res, 'data')) return res.data as T;
  return { rows: (res.rows as T[]) || [], total: res.total || 0 };
}
